package com.example.itcacp.util;

import java.util.Map;

public class UserSimilarityCalculator {

    /**
     * 计算两个用户之间的余弦相似度
     * @param user1Items 用户1的内容操作记录
     * @param user2Items 用户2的内容操作记录
     * @return 相似度分数
     */
    public double calculateCosineSimilarity(Map<Long, Integer> user1Items, Map<Long, Integer> user2Items) {
        // 计算向量点积
        double dotProduct = 0.0;
        for (Long contentId : user1Items.keySet()) {
            if (user2Items.containsKey(contentId)) {
                // 可以根据业务需求调整权重，例如浏览记录权重低于点赞
                dotProduct += user1Items.get(contentId) * user2Items.get(contentId);
            }
        }

        // 计算向量模长
        double normA = Math.sqrt(user1Items.values().stream()
                .mapToDouble(value -> Math.pow(value, 2)).sum());

        double normB = Math.sqrt(user2Items.values().stream()
                .mapToDouble(value -> Math.pow(value, 2)).sum());

        // 防止除零错误
        if (normA == 0 || normB == 0) {
            return 0.0;
        }

        return dotProduct / (normA * normB);
    }

}
